package com.tamecode.chapter07.sec2.proxy.jdk;

import com.tamecode.chapter07.sec2.PerformanceMonitor;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * @Author: Qiongchao
 * @Version: 1.0.0
 * @Date: 2023/10/16
 */
public class PerformanceHandler implements InvocationHandler { // ① 实现 InvocationHandler

    private Object target;

    public PerformanceHandler(Object target) { //②target 为目标业务类
        this.target = target;
    }

    /**
     * 实现 InvocationHandler 接口，该接口定义了一个 invoke(Object proxy, Method method, Object[] args)方法
     * @param proxy 最终生成的代理实例，一般不会用到
     * @param method 被代理目标实例的某个具体方法，通过它可以发起目标实例方法的反射调用
     * @param args 是被代理实例某个方法的入参，在方法反射调用时使用。
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // ③
        PerformanceMonitor.begin(target.getClass().getName() + "." + method.getName()); // ③-1
        Object obj = method.invoke(target, args); // ③-2 通过反向方法调用业务类的目标方法
        PerformanceMonitor.end(); // ③-1
        return obj;
    }

}
